package com.divemotor.ventarepuestosinternet.model;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

@Entity
@Table(name="REP_MOV_COTIZACION")
@NamedQueries({
	@NamedQuery(name="Cotizacion.usuario", query="SELECT c from Cotizacion c WHERE c.usuarioCliente.usuario.idUsuario=:idUsuario"),
	@NamedQuery(name="Cotizacion.listarElementosRepuestos", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ElementoCotizacionAdapter(irc.chasis, irc.tipoVehiculo, " +
					  "irc.marca, irc.placa, 'Repuesto', irc.modelo, irc.cantidad, r.codigo, r.nombre || ' ' || ir.observacion || ' ' || ir.txtObsRepuesto2, c.idCotizacion) " +
					  "FROM Cotizacion c " +
					  "JOIN c.listaImagenRepuestoCotizaciones irc JOIN irc.imagenRepuesto ir JOIN ir.repuesto r " +
					  "WHERE c.idCotizacion = :idCotizacion"),
	@NamedQuery(name="Cotizacion.listarElementosPromocion", 
		  	    query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ElementoCotizacionAdapter('N/A', 'N/A', 'N/A', " +
					  "'N/A', 'Promoci\u00f3n', 'N/A', lp.cantidad, pr.codigo, pr.descripcion, c.idCotizacion) " +
					  "FROM Cotizacion c " +
					  "JOIN c.listaPromocionCotizaciones lp JOIN lp.promocion pr " +
					  "WHERE c.idCotizacion = :idCotizacion"),
	@NamedQuery(name="Cotizacion.detalleElementoRepuesto", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ElementoCotizacionAdapter(ir.posicion, gr.codigo, gr.nombre, " +
					  "sg.codigo, sg.nombre, rep.codigo, rep.nombre || ' ' || ir.observacion || ' ' || ir.txtObsRepuesto2, img.tipo, img.nombreArchivo) " +
					  "FROM Cotizacion c " +
					  "JOIN c.listaImagenRepuestoCotizaciones irc JOIN irc.imagenRepuesto ir JOIN ir.imagen img JOIN ir.repuesto rep " +
					  "JOIN img.subGrupo sg JOIN sg.grupo gr " +
					  "WHERE c.idCotizacion = :idCotizacion"),
	@NamedQuery(name="Cotizacion.detalleElementoPromocion", 
				query="SELECT new com.divemotor.ventarepuestosinternet.beans.adapter.ElementoCotizacionAdapter(pr.idPromocion, pr.descripcion) " +
					  "FROM Cotizacion c " +
					  "JOIN c.listaPromocionCotizaciones prc JOIN prc.promocion pr " +
					  "WHERE c.idCotizacion = :idCotizacion")
																	
})
public class Cotizacion implements Serializable{

	private static final long serialVersionUID = -1658975669141155854L;

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_REP_MOV_COTIZACION")
	@SequenceGenerator(name = "SEQ_REP_MOV_COTIZACION",  sequenceName = "REPUESTOS.SEQ_REP_MOV_COTIZACION", allocationSize = 0)
	@Column(name = "num_id_cotizacion")
	private Integer idCotizacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_estado_cotizacion" , referencedColumnName="cod_id_estado_cotizacion")
	private EstadoCotizacion estadoCotizacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_sucursal" , referencedColumnName="cod_id_sucursal") 
	private Sucursal sucursal;
	@ManyToOne(fetch=FetchType.LAZY, optional=true)
	@JoinColumn(name="cod_id_vendedor" , referencedColumnName="cod_id_vendedor") 
	private Vendedor vendedor;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cod_id_usuario_cliente" , referencedColumnName="cod_id_usuario_cliente") 
	private UsuarioCliente usuarioCliente;
	@Column (name = "txt_observacion", length = 500)
	private String observacion;	
	@Column (name="ind_estado", length = 1)
	private String  estado;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_CREACION",referencedColumnName="COD_ID_USUARIO" )
	private Usuario usuarioCreacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_MODIFICACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioModificacion;
	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name="COD_ID_USUARIO_ELIMINACION",referencedColumnName="COD_ID_USUARIO")
	private Usuario usuarioEliminacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_creacion")
	private Date fechaCreacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_modificacion")
	private Date fechaModificacion;
	@Temporal(TemporalType.DATE)
	@Column(name = "fec_eliminacion")
	private Date fechaEliminacion;
	@OneToMany( mappedBy = "cotizacion", fetch = FetchType.LAZY)
	private List<ImagenRepuestoCotizacion> listaImagenRepuestoCotizaciones;
	@OneToMany( mappedBy = "cotizacion", fetch = FetchType.LAZY)
	private List<PromocionCotizacion> listaPromocionCotizaciones;
	
	@Transient
	private String cliente;
	
	public Cotizacion() {
	}

	public Cotizacion(Integer idCotizacion) {
		this.idCotizacion = idCotizacion;
	}

	public EstadoCotizacion getEstadoCotizacion() {
		return estadoCotizacion;
	}

	public void setEstadoCotizacion(EstadoCotizacion estadoCotizacion) {
		this.estadoCotizacion = estadoCotizacion;
	}

	public Sucursal getSucursal() {
		return sucursal;
	}

	public void setSucursal(Sucursal sucursal) {
		this.sucursal = sucursal;
	}

	public Vendedor getVendedor() {
		return vendedor;
	}

	public void setVendedor(Vendedor vendedor) {
		this.vendedor = vendedor;
	}

	public UsuarioCliente getUsuarioCliente() {
		return usuarioCliente;
	}

	public void setUsuarioCliente(UsuarioCliente usuarioCliente) {
		this.usuarioCliente = usuarioCliente;
	}

	public String getEstado() {
		return estado;
	}

	public void setEstado(String estado) {
		this.estado = estado;
	}

	public Usuario getUsuarioCreacion() {
		return usuarioCreacion;
	}

	public void setUsuarioCreacion(Usuario usuarioCreacion) {
		this.usuarioCreacion = usuarioCreacion;
	}

	public Usuario getUsuarioModificacion() {
		return usuarioModificacion;
	}

	public void setUsuarioModificacion(Usuario usuarioModificacion) {
		this.usuarioModificacion = usuarioModificacion;
	}

	public Usuario getUsuarioEliminacion() {
		return usuarioEliminacion;
	}

	public void setUsuarioEliminacion(Usuario usuarioEliminacion) {
		this.usuarioEliminacion = usuarioEliminacion;
	}

	public Date getFechaCreacion() {
		return fechaCreacion;
	}

	public void setFechaCreacion(Date fechaCreacion) {
		this.fechaCreacion = fechaCreacion;
	}

	public Date getFechaModificacion() {
		return fechaModificacion;
	}

	public void setFechaModificacion(Date fechaModificacion) {
		this.fechaModificacion = fechaModificacion;
	}

	public Date getFechaEliminacion() {
		return fechaEliminacion;
	}

	public void setFechaEliminacion(Date fechaEliminacion) {
		this.fechaEliminacion = fechaEliminacion;
	}
	public Integer getIdCotizacion() {
		return idCotizacion;
	}

	public void setIdCotizacion(Integer idCotizacion) {
		this.idCotizacion = idCotizacion;
	}

	public String getObservacion() {
		return observacion;
	}

	public void setObservacion(String observacion) {
		this.observacion = observacion;
	}
	
	public List<ImagenRepuestoCotizacion> getListaImagenRepuestoCotizaciones() {
		return listaImagenRepuestoCotizaciones;
	}

	public void setListaImagenRepuestoCotizaciones(
			List<ImagenRepuestoCotizacion> listaImagenRepuestoCotizaciones) {
		this.listaImagenRepuestoCotizaciones = listaImagenRepuestoCotizaciones;
	}

	public List<PromocionCotizacion> getListaPromocionCotizaciones() {
		return listaPromocionCotizaciones;
	}

	public void setListaPromocionCotizaciones(List<PromocionCotizacion> listaPromocionCotizaciones) {
		this.listaPromocionCotizaciones = listaPromocionCotizaciones;
	}

	public String getCliente() {
		return cliente;
	}

	public void setCliente(String cliente) {
		this.cliente = cliente;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((idCotizacion == null) ? 0 : idCotizacion.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj){
			return true;
		}
		if (obj == null){
			return false;
		}
		if (getClass() != obj.getClass()){
			return false;
		}
		Cotizacion other = (Cotizacion) obj;
		if (idCotizacion == null) {
			if (other.idCotizacion != null){
				return false;
			}
		} else if (!idCotizacion.equals(other.idCotizacion)){
			return false;
		}
		return true;
	}

	

	
}
